package com.ig.presentacion.modelos.desembolso.calculos;

import com.ig.presentacion.modelos.desembolso.calculos.interfaces.IModalidad;

/**
 * Clase encargada de generar los planes de amortizaci?n
 * 	1	Cuota Variable, TasaVariable
 * 	2	Cuota Variable, Tasa Fija
 * 	3	Cuota Fija, Tasa Fija
 * 
 * Cada uno de estos metodos supone
 * 	que el interes ya esta convertido a la frecuencia
 * 		
 * @author jsanchez
 *
 */
public class CuotaVariableTasaVariable{
	private int periodoGracia=0;
        private Fechas fechas= null;	
	boolean debug=false;

	public CuotaVariableTasaVariable(Fechas fechas){
		this.fechas = fechas;
	}
	
	public void setPeriodoGracia(int periodoGracia) {
		this.periodoGracia = periodoGracia;
	}
	
	public CuotaVariableTasaVariable(Fechas fechas,boolean debug){
		this.fechas= fechas;		
		this.debug=debug;
	}
	
	/**
	 * @param fechaPagoInicial 
	 * 
	 * Ejemplo: 05052006 
	 */
	public void setFechaPagoInicial(String fechaPagoInicial) {	
		fechas.setDia(fechaPagoInicial.substring(0,2));
		fechas.setMes(fechaPagoInicial.substring(2,4));	
		fechas.setAnno(fechaPagoInicial.substring(4,8));
	}
	
	/**
	 * @param frecuencia 
	 * :puede ser 
	 * 	Fechas.DIARION=1
	 * 	Fechas.SEMANAL=2
	 * 	Fechas.MENSUAL=3
	 * 	Fechas.TRIMESTRAL=4
	 * 	Fechas.SEMESTRAL=5
	 * 	Fechas.ANUAL=6
	 */
	public void setTipoFrecuencia(int tipoFrecuencia) {
		this.fechas.setTipoFrecuencia(tipoFrecuencia);
	}
	
	/**
	 * tipo de calendario para el calculos de los intereses
	 * 
	 * @param calendario
	 * 	puedes ser:
	 *  
	 * 	Calendarios.CALENDARIO_REAL=1 todos los a?os son de 365 o 366 dias y los meses de 28, 29, 30, 31 dias
	 * 	Calendarios.CALENDARIO_COMERCIAL=2 todos los a?os tines 360 dias u los meses de 30 dias
	 * 	Calendarios.CALENDARIO_365=3 todos los meses tienen 365 dias y los meses de 28, 30, 31 dias  
	 */
	public void setCalendarioCalculoInteres(int calendario) {
		this.fechas.setCalendario(calendario);
	}	

    /**
     * calcula el plan de amortizacion para cuotas varibles y tasa variables
     *      
     * @param monto 				: valor	desembolsado
     * @param interesVariable	: vector de intereses ya convertidos a frecuencia de pago
     * @param plazo				: frecuencia de pago
     * @return					: matriz con filas=plazo.leng & columnas 5[fecha, cuota, interes, capital, saldocapital]
     */
    public Object[][] calcularPlanCuotaVariableTasaVariable(double monto, Double[] interesVariable, int plazo){

	Double cuotas=(monto/plazo);
	Double calculoInteres=0.0;
	Double calculoCapital=0.0;
	Double saldo=monto;
	Object[][] vPlan= new Object[plazo][6];
	
	Double[] IntereesReal= new Double[plazo];	
	for (int i = 0; i < IntereesReal.length; i++) {
            if(interesVariable.length>i){
                if(interesVariable[i]==null)
                    IntereesReal[i]=Double.parseDouble("0");
                else IntereesReal[i]=interesVariable[i];
            }else IntereesReal[i]=Double.parseDouble("0");
	}

	int Ncuota=0;
	for (int i = 1; i <= plazo; i++) {		
		vPlan[i-1][0]=Double.valueOf(i);
			
		if(i<=periodoGracia) calculoInteres=0.0;
		else calculoInteres=Double.valueOf(Math.round(saldo*IntereesReal[i-1]));
                
		vPlan[i-1][1]=fechas.getFormatoString();
			
		vPlan[i-1][2]=cuotas+calculoInteres;
			
		vPlan[i-1][3]=calculoInteres;
			
		calculoCapital=cuotas;
		vPlan[i-1][4]=calculoCapital;
			
		saldo-=calculoCapital;                
		vPlan[i-1][5]=saldo;			
	}
        if(debug){
                System.out.println("VALOR CUOTA:"+cuotas);
                System.out.println("VALOR MONTO:"+monto);
                System.out.println("		CUOTA		FECHA			CUOTAS		INTERES		CAPITAL		SALDO");
                System.out.println("	*********************************************************************************************");            
                for (int i = 0; i < plazo; i++) {
                    for (int j = 0; j < 6; j++) {
                        if(j==1){                                
                            System.out.print("		"+vPlan[i][j]);
                        }else            
                            System.out.print("		"+Math.round((Double)vPlan[i][j]));
                    }
                    System.out.print("\n");
                }
                System.out.println("	*********************************************************************************************");                        
        }
    		return vPlan;
 }   
}